package com.nbcio.cd.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nbcio.cd.domain.CdFile;
import com.nbcio.cd.domain.vo.CdFileVo;
import com.nbcio.common.core.domain.R;
import org.springframework.web.multipart.MultipartFile;

import jakarta.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 云网盘文件Service接口
 *
 * @author nbacheng
 */
public interface ICdFileService extends IService<CdFile> {

    /**
     * 上传文件
     *
     * @param file 文件
     * @param folderId 文件夹ID
     * @return 文件信息
     */
    CdFileVo uploadFile(MultipartFile file, Long folderId);

    /**
     * 下载文件
     *
     * @param fileId 文件ID
     * @param response HTTP响应
     */
    void downloadFile(Long fileId, HttpServletResponse response);

    /**
     * 预览文件
     *
     * @param fileId 文件ID
     * @return 预览URL
     */
    String previewFile(Long fileId);

    /**
     * 预览Office文档 - 返回HTML内容
     *
     * @param fileId 文件ID
     * @param response HTTP响应
     */
    void previewHtml(Long fileId, HttpServletResponse response);

    /**
     * 重命名文件
     *
     * @param fileId 文件ID
     * @param newName 新名称
     * @return 操作结果
     */
    Boolean renameFile(Long fileId, String newName);

    /**
     * 移动文件
     *
     * @param fileId 文件ID
     * @param targetFolderId 目标文件夹ID
     * @return 操作结果
     */
    Boolean moveFile(Long fileId, Long targetFolderId);

    /**
     * 复制文件
     *
     * @param fileId 文件ID
     * @param targetFolderId 目标文件夹ID
     * @return 操作结果
     */
    Boolean copyFile(Long fileId, Long targetFolderId);

    /**
     * 删除文件
     *
     * @param fileIds 文件ID列表
     * @return 操作结果
     */
    Boolean deleteFiles(List<Long> fileIds);

    /**
     * 查询文件列表
     *
     * @param folderId 文件夹ID
     * @param fileName 文件名（可选）
     * @param fileType 文件类型（可选）
     * @param pageQuery 分页查询
     * @return 文件列表
     */
    R<List<CdFileVo>> queryFileList(Long folderId, String fileName, String fileType, CdFileVo pageQuery);

    /**
     * 搜索文件
     *
     * @param keyword 关键词
     * @param fileType 文件类型（可选）
     * @param pageQuery 分页查询
     * @return 搜索结果
     */
    R<List<CdFileVo>> searchFiles(String keyword, String fileType, CdFileVo pageQuery);

    /**
     * 获取文件详情
     *
     * @param fileId 文件ID
     * @return 文件详情
     */
    CdFileVo getFileInfo(Long fileId);

    /**
     * 检查文件权限
     *
     * @param fileId 文件ID
     * @param permissionType 权限类型
     * @return 是否有权限
     */
    Boolean checkFilePermission(Long fileId, String permissionType);
}
